#ifndef _SymbTable_hpp
#define _SymbTable_hpp

#include <map>
#include <vector>
#include <string>
#include <cstdio>
#include <iostream>


#include "categorie/Categorie.hpp"
#include "categorie/Variable.hpp"
#include "categorie/Argument.hpp"
#include "categorie/Program.hpp"
#include "categorie/Constante.hpp"
#include "categorie/Temporaire.hpp"




using std::string;
using std::map;
using std::pair;
using std::cout;

class Procedure;
class Fonction;

class SymbTable{
public:	
	SymbTable();
	~SymbTable();
	void ajouter(int id, string v1,string v2);
  	void ajouterVariable(int id, int type);
	void ajouterArgument(int id, int type);
    void ajouterProgram(int id);
    void ajouterFonction(int id, int type, int arite, SymbTable* ts);
    void ajouterProcedure(int id, int arite, SymbTable* ts);
    void ajouterConstante(int id, int type, void * valeur);
    void ajouterTemporaire(int id, int type);

 	void afficher();
	Categorie * getCategorie(int id);
	void setContexteParent(string parent);
	string getContexteParent();
	void setContexteActuel(string actuel);
	string getContexteActuel();
    int getIdPremier();

private:
    map<int, Categorie*> mLines;
	string contexteParent;    
	string contexteActuel;
};
#include "categorie/Procedure.hpp"
#include "categorie/Fonction.hpp"
#endif
